package org.dllwh.utils.apache.poi.word;


import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGrid;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGridCol;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;

import java.math.BigInteger;

/**
 * 把今天最好的表现当作明天最新的起点．．～
 * <p>
 * Today the best performance as tomorrow the newest starter!
 *
 * @ClassName WordTableHelper
 * @Description Word 表格相关操作工具类
 * @Date 2025-10-24 13:52
 * @版本 V 1.0.1
 * @since JDK 17
 */
public final class WordTable {
    /**
     * 创建表格,创建后表格至少有1行1列,设置列宽度
     *
     * @param document      文档对象
     * @param rowSize       行数
     * @param cellSize      列数
     * @param ifSetColWidth 是否设置列宽度
     * @param colWidths     列宽度数组
     * @return 表格对象
     */
    public static XWPFTable createTable(XWPFDocument document, int rowSize, int cellSize, boolean ifSetColWidth, int[] colWidths) {
        XWPFTable table = document.createTable(rowSize, cellSize);
        // 设置表格宽度
        table.setWidth("100%");
        // 设置列宽度
        if (ifSetColWidth) {
            CTTblGrid tblGrid = table.getCTTbl().addNewTblGrid();
            for (int i = 0, len = Math.min(cellSize, colWidths.length); i < len; i++) {
                CTTblGridCol gridCol = tblGrid.addNewGridCol();
                gridCol.setW(new BigInteger(String.valueOf(colWidths[i])));
            }
        }
        return table;
    }

    /**
     * 设置表格对齐方式
     *
     * @param table     表格
     * @param rowIndex  行索引
     * @param cellIndex 单元格索引
     * @param alignment 水平对齐方式
     * @param vertAlign 垂直对齐方式
     */
    public static void setTableCellAlign(XWPFTable table, int rowIndex, int cellIndex, ParagraphAlignment alignment, XWPFTableCell.XWPFVertAlign vertAlign) {
        setTableCellAlign(table.getRow(rowIndex), cellIndex, alignment, vertAlign);
    }

    /**
     * 设置表格对齐方式
     *
     * @param tableRow  表格行
     * @param cellIndex 单元格索引
     * @param alignment 水平对齐方式
     * @param vertAlign 垂直对齐方式
     */
    public static void setTableCellAlign(XWPFTableRow tableRow, int cellIndex, ParagraphAlignment alignment, XWPFTableCell.XWPFVertAlign vertAlign) {
        setTableCellAlign(tableRow.getCell(cellIndex), alignment, vertAlign);
    }

    /**
     * 设置表格对齐方式
     *
     * @param cell      单元格
     * @param alignment 水平对齐方式
     * @param vertAlign 垂直对齐方式
     */
    public static void setTableCellAlign(XWPFTableCell cell, ParagraphAlignment alignment, XWPFTableCell.XWPFVertAlign vertAlign) {
        // 获取段落
        XWPFParagraph paragraph = cell.getParagraphs().get(0);
        // 设置水平对齐方式
        paragraph.setAlignment(alignment);
        // 设置垂直对齐方式
        cell.setVerticalAlignment(vertAlign);
    }

    /**
     * 设置表格边框样式
     *
     * @param table 表格对象
     */
    public static void setTableBorders(XWPFTable table) {

    }

    /**
     * 删除表一行 (从0开始)
     *
     * @param table 表格对象
     * @param index 行索引
     */
    public static void deleteTableRow(XWPFTable table, int index) {
        table.removeRow(index);
    }

    /**
     * 合并行
     *
     * @param table    表格对象
     * @param row      行索引
     * @param fromCell 起始列索引
     * @param toCell   结束列索引
     */
    public static void mergeCell(XWPFTable table, int row, int fromCell, int toCell) {
        int tableCellsSize = table.getRow(row).getTableCells().size();
        fromCell = Math.min(fromCell, toCell);
        toCell = Math.min(toCell, tableCellsSize - 1);
        for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
            XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
            // 对单元格进行合并的时候，要标志单元格是否为起点，或者是否为继续合并
            if (cellIndex == fromCell) {
                // 这是起点
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                // 继续合并
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

    /**
     * 合并列
     *
     * @param table   表格对象
     * @param col     列索引
     * @param fromRow 起始行索引
     * @param toRow   结束行索引
     */
    public static void mergeRow(XWPFTable table, int col, int fromRow, int toRow) {

        int tableRowSize = table.getRows().size();
        fromRow = Math.min(fromRow, toRow);
        toRow = Math.min(toRow, tableRowSize - 1);

        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
            if (rowIndex == fromRow) {
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
}
